iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Modern Web

深入前端地圖框架技術探索系列 第 23

Day23:台灣天氣地圖:Mapbox 與中央氣象局 API 結合

  • 分享至 

  • xImage
  •  

今天來實作一個簡易的台灣天氣地圖

在現代地圖應用中,將實時數據結合地圖顯示是非常常見的功能。在這篇文章中,我們將介紹如何利用 中央氣象局開放資料平台 提供的天氣數據,並結合 Mapbox 來動態顯示台灣各縣市的天氣資訊。

api的部分可以到中央氣象局開放資料平臺去找api key和要取得哪種資料
今天使用的是這筆資料
https://ithelp.ithome.com.tw/upload/images/20241001/20161223dNh6nSuPDA.png
先看最後成果
https://ithelp.ithome.com.tw/upload/images/20241001/20161223r8UIKjEv1n.png
POPUP會顯示該縣市的
Wx:天氣現象(Weather Phenomena),描述如晴天、雨天等天氣狀況。
PoP:降雨機率(Probability of Precipitation),以百分比表示降雨的可能性。
MinT:最低溫度(Minimum Temperature),當日預測的最低氣溫。
CI:舒適度指數(Comfort Index),描述體感舒適度。
MaxT:最高溫度(Maximum Temperature),當日預測的最高氣溫。
https://ithelp.ithome.com.tw/upload/images/20241001/20161223j9KQURa5v4.png

fetch('https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=開放資料平台的token&limit=22')
    .then(response => response.json())
    .then(data => {
        var locations = data.records.location.map(location => {
            var cityName = location.locationName;
            var weatherElement = location.weatherElement;
            var weatherDescription = weatherElement.find(e => e.elementName === 'Wx').time[0].parameter.parameterName;
            var pop = weatherElement.find(e => e.elementName === 'PoP').time[0].parameter.parameterName + "%";
            var minTemp = weatherElement.find(e => e.elementName === 'MinT').time[0].parameter.parameterName + "°C";
            var maxTemp = weatherElement.find(e => e.elementName === 'MaxT').time[0].parameter.parameterName + "°C";
            var comfortIndex = weatherElement.find(e => e.elementName === 'CI').time[0].parameter.parameterName;

            var coordinates = getCoordinates(cityName);

            return {
                name: cityName,
                coordinates: coordinates,
                weather: {
                    description: weatherDescription,
                    pop: pop,
                    minTemp: minTemp,
                    maxTemp: maxTemp,
                    comfortIndex: comfortIndex
                }
            };
        });

        locations.forEach(function (location) {
            var popup = new mapboxgl.Popup({ offset: 25 })
                .setHTML(`
                    <h3>${location.name}</h3>
                    <p>天氣狀況: ${location.weather.description}</p>
                    <p>降雨機率: ${location.weather.pop}</p>
                    <p>最低溫度: ${location.weather.minTemp}</p>
                    <p>最高溫度: ${location.weather.maxTemp}</p>
                    <p>舒適度: ${location.weather.comfortIndex}</p>
                `);

            new mapboxgl.Marker()
                .setLngLat(location.coordinates)
                .setPopup(popup)
                .addTo(map);
        });
    })
    .catch(error => console.error('Error:', error));
function getCoordinates(cityName) {
    var coordinates = {
        '臺北市': [121.5654, 25.0330],
        '新北市': [121.6739, 25.0135],
        '桃園市': [121.2168, 24.9375],
        '臺中市': [120.6736, 24.1477],
        '臺南市': [120.2513, 23.1417],
        '高雄市': [120.666, 23.0109],
        '基隆市': [121.7419, 25.1276],
        '新竹市': [120.9647, 24.8030],
        '嘉義市': [120.4473, 23.4755],
        '苗栗縣': [120.9417, 24.4893],
        '彰化縣': [120.4818, 23.9929],
        '南投縣': [120.9876, 23.8388],
        '雲林縣': [120.3897, 23.7559],
        '屏東縣': [120.62, 22.5495],
        '宜蘭縣': [121.7469, 24.7021],
        '花蓮縣': [121.3542, 23.7569],
        '臺東縣': [121.1132, 22.7541],
        '金門縣': [118.3171, 24.4327],
        '澎湖縣': [119.6151, 23.5654],
        '連江縣': [119.5397, 26.1974]
    };
    return coordinates[cityName] || [121.5654, 25.0330];
}

上一篇
Day22:Mapbox Optimization API
下一篇
Day24:Mapbox Geocoding API
系列文
深入前端地圖框架技術探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言